/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package serversocket;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Carlos
 */
public class ServerConexThread extends Thread {

    private String puerto;
    private String puertoSig;
    private int tipo;
    private String Ip;
    private XStream xs = new XStream(new DomDriver());
    private String path;
    private BufferedReader in;

    ServerConexThread(String puertoSig, int i, String ipSig, String portSig) {
        this.puerto = puertoSig;
        this.tipo = i;
        this.Ip = ipSig;
        this.puertoSig = portSig;
    }

    private void abrirSocketEspera() {
        ServerSocket servicio;
        Socket socketServicio = null;
        int fase = 0;
        try {
            servicio = new ServerSocket(Integer.parseInt(puerto));
            socketServicio = null;
            socketServicio = servicio.accept();
        } catch (IOException ex) {
            Logger.getLogger(ServerConexThread.class.getName()).log(Level.SEVERE, null, ex);
        }
        while (fase != -1) {

            try {
                PrintWriter salida = new PrintWriter(socketServicio.getOutputStream(), true);
                BufferedReader entrada = new BufferedReader(new InputStreamReader(socketServicio.getInputStream()));
                String llego = entrada.readLine();
                if (llego.equals("Hola")) {
                    salida.println("Ok");
                    System.out.println("Un nodo se ha conectado a mi puerto" + Integer.parseInt(puerto));
                }
                if (llego.equals("<mensaje>" + "EnvioArchivo" + "</mensaje>")) {
                    path = System.getProperty("user.dir") + "/ListaArchivos.xml";
                    PrintStream envio = new PrintStream(socketServicio.getOutputStream());
                    FileInputStream origen = new FileInputStream(path);
                    byte[] buffer = new byte[1024];
                    int len;
                    while (1 == 1) {
                        len = origen.read(buffer);
                        //llego = entrada.readLine();
                        if (len <= 0) {
                            envio.close();
                            System.out.println("se mando completo");
                            break;
                        } else {
                            envio.write(buffer, 0, len);
                        }
                    }
                }
                //llego = entrada.readLine();
                if (llego.equals("<mensaje>" + "Lista" + "</mensaje>")) {
                    String ruta = entrada.readLine();
                    PrintStream envio = new PrintStream(socketServicio.getOutputStream());
                    FileInputStream origen = new FileInputStream(ruta);
                    byte[] buffer = new byte[1024];
                    int len;
                    while (1 == 1) {
                        len = origen.read(buffer);
                        //llego = entrada.readLine();
                        if (len <= 0) {
                            envio.close();
                            System.out.println("se mando completo");
                            break;
                        } else {
                            envio.write(buffer, 0, len);
                        }
                    }                    
                }
                
            } catch (IOException ex) {
                fase = -1;
                System.out.println("Se cayó");
                System.out.println(ex.getMessage());
            }
        }
    }

    private void abrirSocketActivo() {
        Socket Cliente;
        int fase = 0;
        boolean flag = false;
        while (fase != -1) {
            try {
                if (fase == 2) {
                    Thread.sleep(10000);
                    fase = 1;
                } else {
                    Cliente = new Socket(this.Ip, Integer.parseInt(this.puertoSig));
                    PrintWriter salida = new PrintWriter(Cliente.getOutputStream(), true);
                    BufferedReader entrada = new BufferedReader(new InputStreamReader(Cliente.getInputStream()));
                    InputStream llegada = Cliente.getInputStream();
                    path = System.getProperty("user.dir") + "/ListaArchivostemp.xml";
                    FileOutputStream destino = new FileOutputStream(path);
                    salida.println("Hola");
                    if (entrada.readLine().equals("Ok")) {
                        System.out.println("Me conecte con el siguente nodo por el puerto " + this.puertoSig);
                    }


                    salida.println("<mensaje>" + "EnvioArchivo" + "</mensaje>");


                    byte[] buffer = new byte[1024];
                    int len;
                    while (1 == 1) {
                        len = llegada.read(buffer);
                        if (len <= 0) {
                            System.out.println("Llego completo");
                            break;
                        } else {
                            flag = true;
                            destino.write(buffer, 0, len);
                        }
                    }
                    try {
                        destino.close();
                    } catch (IOException ex) {
                        Logger.getLogger(ClientConexThread.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    List<Archivo> milistarchivo, remlistarchivo = new ArrayList<Archivo>();

                    FileInputStream fis = new FileInputStream(System.getProperty("user.dir") + "/ListaArchivos.xml");
                    milistarchivo = (List<Archivo>) xs.fromXML(fis);
                    FileInputStream fis2 = new FileInputStream(System.getProperty("user.dir") + "/ListaArchivostemp.xml");
                    remlistarchivo = (List<Archivo>) xs.fromXML(fis2);
                    int cant = remlistarchivo.size();
                    for (int i = 1; i <= cant; i++) {
                        if (milistarchivo.contains(remlistarchivo.get(i)) != true) {
                            salida.println("<mensaje>" + "Lista" + "</mensaje>");
                            salida.println("<mensaje>" + remlistarchivo.get(i).getRuta() + "</mensaje>");
                            path = System.getProperty("user.dir") +"/archivos/"+remlistarchivo.get(i).getRuta();                    
                            destino = new FileOutputStream(path);
                            buffer = new byte[1024];

                            while (1 == 1) {
                                len = llegada.read(buffer);
                                if (len <= 0) {
                                    System.out.println("Llego completo");                                    
                                    break;
                                } else {
                                    destino.write(buffer, 0, len);
                                }
                            }
                            try {
                                destino.close();
                            } catch (IOException ex) {
                                Logger.getLogger(ClientConexThread.class.getName()).log(Level.SEVERE, null, ex);
                            }

                        }
                    }

                }
            } catch (Exception e) {                
                System.out.println("No lo encontre voy a esperar un rato");
                fase = 2;
            }
        }
    }

    @Override
    public void run() {
        if (tipo == 1) {
            this.abrirSocketEspera();
        }
        if (tipo == 2) {
            this.abrirSocketActivo();
        }
    }

    public List<Archivo> ActualizaListaArchivo() {
        return null;
    }
}
